package com.team5101.controller;

import com.team5101.entity.AllOrderDTO;
import com.team5101.entity.DetailOrder;
import com.team5101.entity.Order;
import com.team5101.service.IOrderService;
import com.team5101.utils.CreateTwoCodeUtil;
import com.team5101.utils.R;
import com.team5101.weixinpay.WXPay;
import com.team5101.weixinpay.config.MyConfig;
import io.goeasy.GoEasy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.management.Query;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/api/order")
public class OrderController {
    @Autowired
    private IOrderService orderService;

    /*前端穿来获取订单信息的请求*/
    @RequestMapping("/query/{orderCode}")
    @ResponseBody
    public R getAllOrder(@PathVariable("orderCode") String orderCode){
        /*调用service直接返回*/
        return orderService.queryAllOrder(orderCode);
    }
        /*生成一个订单请求*/
        @RequestMapping("/save")
        @ResponseBody
        public R saveAllOrder(@RequestBody AllOrderDTO allOrder){
                return orderService.saveAllOrder(allOrder);
        }

        /*微信支付的二维码的完成*/
    @RequestMapping("/code/{orderCode}")
    public void createOrderCode(@PathVariable("orderCode")  String orderCode , HttpServletResponse response) throws Exception {
        //1.根据订单编号 ， 产生 订单 付款总金额
             //1.1查询数据的订单
            Order order = orderService.queryOrderByOrderCode(orderCode);
            //1.2打印出当前订单的信息
            System.out.println(order.getOrderAccount());
            //1.3获取订单关于电影的详细数据
        DetailOrder detailOrder = orderService.queryDetailOrderByOrderCode(orderCode);
        //2. 走微信统一下单 的流程
        /*自己的配置*/
        MyConfig config = new MyConfig();
        WXPay wxpay = new WXPay(config);
        Map<String, String> data = new HashMap<String, String>();
        /*本次交易 信息*/
        data.put("body", "电影票购买");
        /* 把自己的订单编号放入*/
        data.put("out_trade_no", orderCode);
        /* 设备信息 可以直接默认*/
        data.put("device_info", "");
        /* 付款类型： CNY 表示 元  角 分*/
        data.put("fee_type", "CNY");
        /*总的付款金额：默认一分钱，已经在上面打印*/
        data.put("total_fee", "1");
        /*禁止访问的 iP，可以默认*/
        data.put("spbill_create_ip", "123.12.12.123");
        /*
               回调函数的 url
                  本函数主要是给微信后端给自己后端一个通知
                  nhb7tn.natappfree.cc设置内网穿透
        */
        data.put("notify_url", "http://5cibn4.natappfree.cc/api/order/notify");
        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
        /*产品编号 ：产品编号，在自己本项目中也就是播放厅编号*/
        data.put("product_id", detailOrder.getShowCode()+"");

        Map<String, String> resp = wxpay.unifiedOrder(data);
        System.out.println(resp);
        /* 返回的 code_url 就是 我们要产生的 二维码的 url地址*/
        String codeUrl = resp.get("code_url");
        System.out.println(codeUrl);
        /* ZXing 工具 ： 生成二维码图片*/
        CreateTwoCodeUtil.createTwoCode(codeUrl,response);
    }

    @RequestMapping("notify")
    public void notifyToWX(String orderCode ,HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1. 获取 request参数的值 【判断是否成功】
        System.out.println(orderCode);
        /*开启一个输入流*/
        ServletInputStream inputStream = request.getInputStream();
        byte[] b= new byte[1024];
        int result = 0;
        /*打印出传过来的数据*/
        while( (result = inputStream.read(b)) != -1 ){
            System.out.print(new String(b,0,result));
        }
        System.out.println("===============");
        //2.1 通知 前端跳转页面 【goEasy 消息通知】
           /*
           * 后台推送数据，前台得到通知
           * */
        // 2.1.1 restHost 改成杭州的io   appkey 改成 自己注册的 common key值
        GoEasy goEasy = new GoEasy( "http://rest-hangzhou.goeasy.io", "BC-3a73db077d46482bba5fd1b40369526c");
        /*
        * 从传过的数据的获取到订单编号
        * */
        //channel ：隧道 + 订单编号
        goEasy.publish("my_channel", "success");
        //2.2 响应给 微信后台对应的 格式
        response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>");
    }

    /*把查询数据列表*/
    @RequestMapping("/query/list")
    @ResponseBody
    public R queryAllOrderList(Order order){
         return orderService.queryAllOrderList(order);
    }
}
